package com.test.easyexcel.entity.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.test.easyexcel.entity.entity.ExcelStudentData;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 3489309323@qq.com
 * @create 2020-07-09-13:43
 */

/**
 * 读excel
 *
 * 读的时候是一行行执行的,每次读取一行时都会触发invoke方法的执行
 *
 * invoke方法的参数 ExcelStudentData data 就是读取到的行
 */

@Slf4j
public class ExcelStudentDataListener extends AnalysisEventListener<ExcelStudentData> {
  /**
   * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
   */
  private static final int BATCH_COUNT = 5;
  //定义数据列表
  List<ExcelStudentData> list = new ArrayList<>();

  @Override
  public void invoke(ExcelStudentData data, AnalysisContext analysisContext) {
    //得到读取到的Excel数据航
    log.info("解析到一条数据: {}",data);
    list.add(data);

    //analysisContext.currentReadHolder() //context是除了数据以外的上下文信息

    //使用数据做相关的业务操作

    // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
    /*if (list.size() >= BATCH_COUNT) {
      log.info("存数据库");
      // 存储完成清理 list
      list.clear();
    }*/
  }

  @Override
  public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    //已经读取到所有的数据后
    log.info("所有数据解析完成!一共 {} 条" ,list.size());
  }
}
